﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Entidad;
using SegIdenPC.Herramientas;
using SegIdenPC.Utilitarios;
using log4net;
using GS1.Utilitario;
using System.Drawing.Imaging;
using System.Configuration;


namespace SegIdenPC.Formularios
{
    public partial class frmMantFacturacion : Form
    {

        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmMantFacturacion));

        private const string TITULO = "Facturacion";
        private const string FORMATO_TOTAL_ENCONTRADOS = "Total productos encontrados: {0}";

        private const string FORMATO_MONTO = "#0.00";

        private const string ETIQUETA_SUBTOTAL = "SubTotal";
        private const string ETIQUETA_TOTAL = "Total";

        private const string LLAVE_DIRECCIONIMPRESORA = "DIRECCIONIMPRESORA";

        public enum OperacionMantenimiento
        {
            Nuevo,
            Editar
        }

        private OperacionMantenimiento tipoOperacion = OperacionMantenimiento.Nuevo;

        private enum Opcion
        {
            Abrir = 0,
            Nuevo = 1,
            Editar = 2,
            Grabar = 3,
            Eliminar = 4,
            Imprimir = 5,
            Cancelar = 6
        }
        private Diseniador diseniadorActual = null;
        private Venta ventaActual = null;
        private Cliente clienteActual = null;
        private Facturacion facturaActual = null;
        
        private Double igvActual = 0.18;
        private ListaVenta listaVenta = null;
        private ListaFacturacion listaFactura = null;
        
        private const string FORMATO_PRODUCTO_DESCRIPCION_DETALLADA = "{0} - {1} - {2} - {3}";
        #endregion

        #region --- Constructor ---
        public frmMantFacturacion()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmMantFacturacion_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            elegirClienteBusqueda();
        }

        private void dgvListadoVenta_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            elegirVentaFactura();
        }
        private void tbtnEditar_Click(object sender, EventArgs e)
        {
            editar();
        }
        private void tbtnCancelar_Click(object sender, EventArgs e)
        {
            cancelar();
        }

        private void chkConsolidado_CheckedChanged(object sender, EventArgs e)
        {
            if (this.chkConsolidado.Checked)
            {
                this.grpConsolidado.Enabled = true;
            }
            else
            {
                this.grpConsolidado.Enabled = false;
                asignaPreciosOriginal();
                this.txtSubtotal.Text = this.ventaActual.subTotal.ToString(Constantes.FORMATO_DECIMAL);
            }
        }

        private void tbtnAbrir_Click(object sender, EventArgs e)
        {
            abrirFactura(); 
        }

        private void dgvListadoVenta_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //elegirVentaFactura(); Se paso a dobleClick
        }

        private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
        {
            if (!e.TabPage.Enabled) { e.Cancel = true; }
        }

        private void tbtnNuevo_Click(object sender, EventArgs e)
        {
           nuevo();  
        }

        private void tbtnSalir_Click(object sender, EventArgs e)
        {
            salir();
        }

        private void btnBuscarDecorador_Click(object sender, EventArgs e)
        {
            elegirDecorador();
        }

        private void btnBuscarCliente_Click(object sender, EventArgs e)
        {
            elegirCliente();
        }

        private void tbtnImprimir_Click(object sender, EventArgs e)
        {
            imprimirFactura();
        }

        private void tbtnGrabar_Click(object sender, EventArgs e)
        {
            //Graba la factura en caso no exista
            if (grabar())
            {
                if (this.tipoOperacion.Equals(OperacionMantenimiento.Nuevo))
                {
                    //si grabo bien, valida si se va a hacer una entrega directa
                    if (this.cboEntregaDirecta.Checked == true)
                    {
                        //se crea una guia electronica antes de imprimir
                        creaGuiaElectronica();
                    }

                Libreria.ShowMessageboxInfo("Documento generado correctamente", TITULO);
                this.grpDatos.Enabled = false;

                // Estableciendo los estados de los botones
                cambiarEstadoBotones(Opcion.Grabar);

                }
            }
        }

        private void txtSubtotal_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.')
            {
                e.Handled = true;
            }

            // only allow one decimal point
            if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1)
            {
                e.Handled = true;
            }
        }

        private void dgvListadoFactura_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
          elegirFactura();
        }

        private void txtSubtotal_LostFocus(object sender, EventArgs e)
        {
        }

        private void btnCalcular_Click(object sender, EventArgs e)
        {
            if (this.ventaActual.listaFacturacion.lista.Count > 0)
            {
             calcularSaldoButton();
            }
            if (this.ventaActual.listaFacturacion.lista.Count == 0)
            {
                calcularSaldo();
            }
            
        }

        #endregion

        #region --- Metodos Propios ---
        private T ejecutarOperacionGenerico<T>(Operacion operacion)
        {
            string contenidoXML = string.Empty;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return default(T);
            }

            return contenidoXML.DeserializarTo<T>();
        }

        private void cargarFormulario()
        {
            ListaGeneral listaEstado = null;
            ListaGeneral listaEstadoFactura = null;
            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Activaciones de botones por rol
                controlBotonesPorRol();

                // Instanciando y creando listado de estado
                listaEstado = new ListaGeneral();
                listaEstado.Add(new General { codigo = Constantes.ESTADO_VENTA_PENDIENTE, descripcion = Constantes.ESTADO_VENTA_DESCRIPCION_PENDIENTE });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_VENTA_ANULADO, descripcion = Constantes.ESTADO_VENTA_DESCRIPCION_ANULADO });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_VENTA_DESPACHADO, descripcion = Constantes.ESTADO_VENTA_DESCRIPCION_DESPACHADO }); 
                listaEstado.Add(new General { codigo = Constantes.ESTADO_VENTA_PARCIAL, descripcion = Constantes.ESTADO_VENTA_DESCRIPCION_PARCIAL });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_VENTA_IMPRESA, descripcion = Constantes.ESTADO_VENTA_DESCRIPCION_IMPRESA });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_VENTA_DEVUELTO, descripcion = Constantes.ESTADO_VENTA_DESCRIPCION_DEVUELTO });
                
                //Instanciando y creando listado de estado de Factura (Documento)
                listaEstadoFactura = new ListaGeneral();
                listaEstadoFactura.Add(new General { codigo = Constantes.ESTADO_VENTA_PENDIENTE, descripcion = Constantes.ESTADO_VENTA_DESCRIPCION_PENDIENTE });
                listaEstadoFactura.Add(new General { codigo = Constantes.ESTADO_VENTA_ANULADO, descripcion = Constantes.ESTADO_VENTA_DESCRIPCION_ANULADO });
                listaEstadoFactura.Add(new General { codigo = Constantes.ESTADO_VENTA_DESPACHADO, descripcion = Constantes.ESTADO_VENTA_DESCRIPCION_DESPACHADO });
                listaEstadoFactura.Add(new General { codigo = Constantes.ESTADO_VENTA_PARCIAL, descripcion = Constantes.ESTADO_VENTA_DESCRIPCION_PARCIAL });
                listaEstadoFactura.Add(new General { codigo = Constantes.ESTADO_VENTA_IMPRESA, descripcion = Constantes.ESTADO_VENTA_DESCRIPCION_IMPRESA });
                listaEstadoFactura.Add(new General { codigo = Constantes.ESTADO_VENTA_DEVUELTO, descripcion = Constantes.ESTADO_VENTA_DESCRIPCION_DEVUELTO });
                   
                // Desactivando el grupo de campo de informacion
                this.tabPagDatos.Enabled = false;
                // Estableciendo Ficha 0 como seleccion incial
                this.tabControl.SelectedIndex = 0;
                // Capturando evento selecting en el control Tab
                this.tabControl.Selecting += new TabControlCancelEventHandler(tabControl_Selecting);

                // Estableciendo a 0 el texto del total de registros encontrados.
                this.lblTotalRegistrosVenta.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, 0);

                // Desactivando el boton abrir.
                this.tbtnAbrir.Enabled = false;

                // Estableciendo datos del combo Estado
                this.cboEstadoVenta.DataSource = listaEstado;
                this.cboEstadoVenta.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboEstadoVenta.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboEstadoVenta.SelectedIndex = 0;


                // Estableciendo datos del combo Estado
                this.cboEstadoFactura.DataSource = listaEstadoFactura;
                this.cboEstadoFactura.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboEstadoFactura.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboEstadoFactura.SelectedIndex = 0;

                cargarTipoDocumentoVenta();

                // Estableciendo focus

                this.btnBuscar.Focus();

            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }

        }

        private void controlBotonesPorRol()
        {
            if (ParametrosAplicacion.ROL_ADMINISTRADOR.codigo.Equals(ParametrosAplicacion.USUARIO_ACTUAL.rol.codigo)) { return; }

            this.tbtnNuevo.Visible = true;
            //this.tbtnEditar.Visible = true;
            //this.tbtnEliminar.Visible = false;
            this.tbtnGrabar.Visible = false;
        }

        private void cargarTipoDocumentoVenta()
        {
            ListaTipoDocumentoVenta listaTipoDocumentoVenta = null;

            // Estableciendo operacion a ser enviada al Servicio REST
            Operacion operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_TIPO_DOCUMENTO_VENTA;

            listaTipoDocumentoVenta = ejecutarOperacionGenerico<ListaTipoDocumentoVenta>(operacion);
            if (listaTipoDocumentoVenta == null) { return; }

            // Estableciendo parametros del combo Tipo doc venta
            this.cboTipoDocVenta.DataSource = listaTipoDocumentoVenta.lista;
            this.cboTipoDocVenta.ValueMember = Constantes.GENERAL_CODIGO;
            this.cboTipoDocVenta.DisplayMember = Constantes.GENERAL_DESCRIPCION;
            this.cboTipoDocVenta.SelectedIndex = 0;
        }

        private void elegirClienteBusqueda()
        {
            using (frmMantCliente frmMantCliente = new frmMantCliente())
            {
                frmMantCliente.formularioBusqueda = true;
                if (frmMantCliente.ShowDialog() == DialogResult.Cancel) { return; }

                this.clienteActual = frmMantCliente.clienteActual;
                this.txtClienteBusqueda.Text = this.clienteActual.razonSocial;
            }

            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_VENTAS;

            operacion.venta = new Venta();
            operacion.venta.cliente = new Cliente();
            operacion.venta.cliente = this.clienteActual;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de la lista de solicitudes pendientes de autorizacion
            this.listaVenta = contenidoXML.DeserializarTo<ListaVenta>();

            // Mostrar el total de registros encontrados
            this.lblTotalRegistrosVenta.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, this.listaVenta.lista.Count);

            // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
            this.dgvListadoVenta.AutoGenerateColumns = false;

            // Se establece la fuente de datos de la grilla
            this.dgvListadoVenta.DataSource = this.listaVenta.lista;

            // Colorear grilla deacuerdo a criterios
            pintarGrillaVenta(dgvListadoVenta);

            elegirVentaFactura();

            elegirFactura();
        }
        
        private void 
            pintarGrillaVenta(DataGridView grilla)
        {

            //Falta corregir
            ListPersonalizada<Venta> listaVenta = null;
            listaVenta = (ListPersonalizada<Venta>)grilla.DataSource;

            if (listaVenta != null)
            {
                for (int i = 0; i < listaVenta.Count; i++)
                {
                    Venta venta = listaVenta[i];

                    grilla.Rows[i].Cells[0].Value = venta.codVenta;
                    grilla.Rows[i].Cells[1].Value = Convert.ToDateTime(venta.fechaRegistro).ToString(Constantes.FORMATO_FECHA);
                    grilla.Rows[i].Cells[2].Value = venta.serie;
                    grilla.Rows[i].Cells[3].Value = venta.numero;
                    grilla.Rows[i].Cells[4].Value = venta.tienda.nombre;
                    grilla.Rows[i].Cells[5].Value = venta.total;
                    grilla.Rows[i].Cells[6].Value = venta.saldo;

                }
            }
        }

        private void salir()
        {
            this.Close();
        }

        private void calcularSaldo()
        {
            //-----------------------------------------------------------------------
            //El Precio ya incluye el IGV, en el momento que se decida si el cliente quiere factura o boleta se define el calculo.
            //Si el saldo es igual a la venta total, es la primera factura
            //Sino se cargarán los datos de la siguiente factura
            //-----------------------------------------------------------------------

            //calculando el IGV 
            this.txtIGV.Text = Math.Round(this.txtSubtotal.Text.ToDouble() * this.igvActual, 2).ToString(Constantes.FORMATO_DECIMAL);

            //calculando el total
            this.txtTotalConsolidado.Text = Math.Round(this.txtSubtotal.Text.ToDouble() + this.txtIGV.Text.ToDouble(), 2).ToString(Constantes.FORMATO_DECIMAL);

            //calculando el saldo
            this.txtSaldo.Text = Math.Round(this.txtTotal.Text.ToDouble() - this.txtTotalConsolidado.Text.ToDouble(),2).ToString(Constantes.FORMATO_DECIMAL);

            if (this.txtSaldo.Text.ToDouble() < 0) this.txtSaldo.Text = "0.00";
            //-----------------------------------------------------------------------
        }

        private void calcularSaldoMas()
        {
            //-----------------------------------------------------------------------
            //El Precio ya incluye el IGV, en el momento que se decida si el cliente quiere factura o boleta se define el calculo.
            //Si el saldo es igual a la venta total, es la primera factura
            //Sino se cargarán los datos de la siguiente factura
            //-----------------------------------------------------------------------

            //calculando el IGV 
            this.txtIGV.Text = Math.Round(this.txtSubtotal.Text.ToDouble() * this.igvActual, 2).ToString(Constantes.FORMATO_DECIMAL);

            //calculando el total
            this.txtTotalConsolidado.Text = Math.Round(this.txtSubtotal.Text.ToDouble() + this.txtIGV.Text.ToDouble(), 2).ToString(Constantes.FORMATO_DECIMAL);

            //calculando el saldo
            this.txtSaldo.Text = Math.Round(this.txtSaldo.Text.ToDouble() - this.txtTotalConsolidado.Text.ToDouble(), 2).ToString(Constantes.FORMATO_DECIMAL);

            if (this.txtSaldo.Text.ToDouble() < 0) this.txtSaldo.Text = "0.00";
            //-----------------------------------------------------------------------
        }

        private void calcularSaldoButton()
        {
            //-----------------------------------------------------------------------
            //El Precio ya incluye el IGV, en el momento que se decida si el cliente quiere factura o boleta se define el calculo.
            //Si el saldo es igual a la venta total, es la primera factura
            //Sino se cargarán los datos de la siguiente factura
            //-----------------------------------------------------------------------

            //calculando el IGV 
            this.txtIGV.Text = Math.Round(this.txtSubtotal.Text.ToDouble() * this.igvActual, 2).ToString(Constantes.FORMATO_DECIMAL);

            //calculando el total
            this.txtTotalConsolidado.Text = Math.Round(this.txtSubtotal.Text.ToDouble() + this.txtIGV.Text.ToDouble(), 2).ToString(Constantes.FORMATO_DECIMAL);

            //calculando el saldo
            this.txtSaldo.Text = Math.Round(this.ventaActual.saldo - this.txtTotalConsolidado.Text.ToDouble(),2).ToString(Constantes.FORMATO_DECIMAL);

            if (this.txtSaldo.Text.ToDouble() < 0) this.txtSaldo.Text = "0.00";
            //-----------------------------------------------------------------------
        }

        private void elegirVentaFactura()
        {
            // Valida si seleccione algun cliente
            if (this.dgvListadoVenta.CurrentRow != null && this.dgvListadoVenta.CurrentRow.Index > -1)
            {
                ListPersonalizada<Venta> listaVenta = (ListPersonalizada<Venta>)this.dgvListadoVenta.DataSource;
                this.ventaActual = listaVenta[this.dgvListadoVenta.CurrentRow.Index];

                Operacion operacion = null;
                string contenidoXML = string.Empty;

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_OBTENER_VENTA;

                operacion.venta = new Venta();
                operacion.venta = this.ventaActual;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                // Obteniendo Objeto de la lista de solicitudes pendientes de autorizacion
                Venta ventaObtenido = new Venta();
                ventaObtenido = contenidoXML.DeserializarTo<Venta>();

                if (ventaObtenido.listaFacturacion.lista.Count > 0)
                {
                    
                    // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                    this.dgvListadoFactura.AutoGenerateColumns = false;

                    // Se establece la fuente de datos de la grilla
                    this.dgvListadoFactura.DataSource = ventaObtenido.listaFacturacion.lista;

                    // Colorear grilla deacuerdo a criterios
                    pintarGrillaFactura(dgvListadoFactura);
                    
                    this.tbtnAbrir.Enabled = true;
                }
                this.ventaActual = ventaObtenido;
                // Mostrar el total de registros encontrados
                this.lblTotalRegistrosFactura.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, ventaObtenido.listaFacturacion.lista.Count);

                // habilita para crear nuevas facturas
                this.tbtnNuevo.Enabled = true;
            }
        }

        private void pintarGrillaFactura(DataGridView grilla)
        {
            ListPersonalizada<Facturacion> listaFactura = null;
            listaFactura = (ListPersonalizada<Facturacion>)grilla.DataSource;

            if (listaFactura != null)
            {
                for (int i = 0; i < listaFactura.Count; i++)
                {
                    Facturacion factura = listaFactura[i];

                    grilla.Rows[i].Cells[0].Value = factura.codFactura;
                    grilla.Rows[i].Cells[1].Value = factura.serie;
                    grilla.Rows[i].Cells[2].Value = factura.numero;
                    grilla.Rows[i].Cells[3].Value = Convert.ToDateTime(factura.fechaRegistro).ToString(Constantes.FORMATO_FECHA);
                    grilla.Rows[i].Cells[4].Value = factura.tiendaFacturacion.descripcion;
                    grilla.Rows[i].Cells[5].Value = factura.totalFacturacion;
                }
            }
        }

        private void cambiarEstadoBotones(Opcion tipoOpcion)
        {
            switch (tipoOpcion)
            {
                case Opcion.Abrir:
                    this.tbtnEditar.Enabled = true;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnImprimir.Enabled = true;
                    this.tbtnAbrir.Enabled = false;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnCancelar.Enabled = true;
                    break;
                case Opcion.Nuevo:
                    this.tbtnGrabar.Enabled = true;
                    
                    this.tbtnSalir.Enabled = true;
                    this.tbtnImprimir.Enabled = false;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnEditar.Enabled = false;
                    break;
                case Opcion.Editar:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnImprimir.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    break;
                case Opcion.Cancelar:
                    this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnCancelar.Enabled = false;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnImprimir.Enabled = false;
                    break;
                case Opcion.Grabar:
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    this.tbtnImprimir.Enabled = false;
                    break;
            }
        }

        private void abrirFactura()
        {
            if (this.facturaActual == null)
            {
                Libreria.ShowMessageboxInfo("Sebe seleccionar una factura", TITULO);
                return;
            }

            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false; this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Abrir);


            //abrir los datos de la factura
            this.txtCodVenta.Text = this.ventaActual.codVenta;
            this.txtFormaVenta.Text = this.ventaActual.formaVenta.descripcion;
            this.cboEntregaDirecta.AutoCheck = true;

            this.txtSerie.Text = this.facturaActual.serie;
            this.txtNumero.Text = this.facturaActual.numero;
            this.cboTipoDocVenta.SelectedValue = this.ventaActual.tipoDocumentoVenta.codigo;
            this.cboEstadoVenta.SelectedValue = this.ventaActual.estado;
            this.txtClienteRazonSocial.Text = this.ventaActual.cliente.razonSocial;

            if (this.ventaActual.diseniador != null)
            {
                this.txtDecoradorCodigo.Text = this.ventaActual.diseniador.codDiseniador;
                this.txtDecoradorDescripcion.Text = this.ventaActual.diseniador.nombresyApellidos;
            }
            else
            {
                this.diseniadorActual = new Diseniador();
                this.txtDecoradorCodigo.Text = string.Empty;
                this.txtDecoradorDescripcion.Text = string.Empty;
            }
            this.txtNotaCreditoSerie.Text = this.ventaActual.notaCreditoSerie;
            this.txtNotaCreditoNumero.Text = this.ventaActual.notaCreditoNumero;

            this.txtMoneda.Text = this.facturaActual.moneda.descripcion;

            this.txtTotal.Text = this.facturaActual.totalFacturacion.ToString(Constantes.FORMATO_DECIMAL);
            this.txtSaldo.Text = this.ventaActual.saldo.ToString(Constantes.FORMATO_DECIMAL);

            //llena la  grilla con lo que se imprimió
            // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
            this.dgvListadoItemsSeleccionados.AutoGenerateColumns = false;


            this.dgvListadoItemsSeleccionados.DataSource = this.facturaActual.listaLineaFacturacion.lista == null ?
                                                   new ListPersonalizada<LineaFacturacion>() :
                                                   this.facturaActual.listaLineaFacturacion.lista;

            this.txtDetalleDescripcion.Text = String.Empty;
            
            pintarGrillaDetalleFactura(this.dgvListadoItemsSeleccionados);
            //el check está apagado
            this.chkConsolidado.Checked = false;
            this.chkConsolidado.Enabled = false;

            this.txtSerie.Enabled = false;
            this.txtNumero.Enabled = false;
           // this.cboTipoDocVenta.Enabled = false;
            //el contenido no se puede editar
            this.grpConsolidado.Enabled = false;

            this.cboEstadoFactura.Enabled = false;
            this.cboEstadoFactura.SelectedValue = this.facturaActual.estado;
           
            //se define que es una apertura, por lo que cuando se graba no se crea, sino se actualiza (OJO)
            //this.tipoOperacion = OperacionMantenimiento.Editar;
        }

        private void nuevo()
        {
            if (this.clienteActual == null)
            {
               Libreria.ShowMessageboxInfo("Debe buscar un cliente ", TITULO);
               return;
            }

            //Si venta actual es > 0 , es la siguientes factutras..
            if (this.ventaActual.listaFacturacion.lista.Count> 0)
            {
                //Si tiene más de una factura y saldo es = 0, 
                if (this.ventaActual.saldo.Equals(0))
                {
                    Libreria.ShowMessageboxInfo("La venta no tiene saldo que facturar", TITULO);
                    return;
                }
            }
            
            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false; 
            this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            this.grpDatos.Enabled = true;
      
            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Nuevo);

            this.tipoOperacion = OperacionMantenimiento.Nuevo;

            // Estableciendo focus control txtDescripcion
            this.txtClienteRazonSocial.Focus();

            this.txtCodVenta.Text = this.ventaActual.codVenta;
            this.txtFormaVenta.Text = this.ventaActual.formaVenta.descripcion;
            this.cboEntregaDirecta.AutoCheck = true;
            this.chkConsolidado.Enabled = true;
            this.cboTipoDocVenta.SelectedValue = this.ventaActual.tipoDocumentoVenta.codigo;

            this.txtSerie.Text = this.ventaActual.serie;
            this.txtNumero.Text = this.ventaActual.numero;

            this.txtClienteRazonSocial.Text = this.ventaActual.cliente.razonSocial;

            if (this.ventaActual.diseniador != null)
            {
                this.txtDecoradorCodigo.Text = this.ventaActual.diseniador.codDiseniador;
                this.txtDecoradorDescripcion.Text = this.ventaActual.diseniador.nombresyApellidos;
            }
            else
            {
                this.diseniadorActual = new Diseniador();
                this.txtDecoradorCodigo.Text = string.Empty;
                this.txtDecoradorDescripcion.Text = string.Empty;
            }
            this.txtNotaCreditoSerie.Text = this.ventaActual.notaCreditoSerie;
            this.txtNotaCreditoNumero.Text = this.ventaActual.notaCreditoNumero;
            
            this.txtMoneda.Text = this.ventaActual.moneda.descripcion;

            asignaPreciosOriginal();
            //Si venta actual es = 0, primera factura
            if (this.ventaActual.listaFacturacion.lista.Count == 0)
            //Si el saldo es igual a la venta total, es la primera factura
            // if (this.ventaActual.saldo.Equals(this.ventaActual.total))
            {
                //llena la  grilla con lo que se imprimiría
                // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                this.dgvListadoItemsSeleccionados.AutoGenerateColumns = false;


                this.dgvListadoItemsSeleccionados.DataSource = this.ventaActual.listaLineaVenta.lista == null ?
                                                       new ListPersonalizada<LineaVenta>() :
                                                       this.ventaActual.listaLineaVenta.lista;

                this.txtDetalleDescripcion.Text = "Muebles";
                // this.txtSubtotal.Text = this.ventaActual.subTotal; // OJO


                pintarGrillaDetalle(this.dgvListadoItemsSeleccionados);
                //el check está apagado
                this.chkConsolidado.Checked = false;
                //el contenido no se puede editar
                this.grpConsolidado.Enabled = false;

                this.txtSubtotal.Text = this.ventaActual.subTotal.ToString(Constantes.FORMATO_DECIMAL);
               // this.cboEstadoFactura.Text = Constantes.ESTADO_VENTA_DESCRIPCION_PENDIENTE;
          


            }

            else
            {
                this.chkConsolidado.Checked = true;
                this.grpConsolidado.Enabled = true;
                this.txtDetalleDescripcion.Text = "Muebles";
                this.dgvListadoItemsSeleccionados.Enabled = false;

            }

            switch (this.ventaActual.estado)
            {
                case Constantes.ESTADO_VENTA_ANULADO:
                    this.cboEstadoVenta.Text = Constantes.ESTADO_VENTA_DESCRIPCION_ANULADO;
                    break;
                case Constantes.ESTADO_VENTA_DESPACHADO:
                    this.cboEstadoVenta.Text = Constantes.ESTADO_VENTA_DESCRIPCION_DESPACHADO;
                    break;
                case Constantes.ESTADO_VENTA_IMPRESA:
                    this.cboEstadoVenta.Text = Constantes.ESTADO_VENTA_DESCRIPCION_IMPRESA;
                    break;
                case Constantes.ESTADO_VENTA_PARCIAL:
                    this.cboEstadoVenta.Text = Constantes.ESTADO_VENTA_DESCRIPCION_PARCIAL;
                    break;
                case Constantes.ESTADO_VENTA_PENDIENTE:
                    this.cboEstadoVenta.Text = Constantes.ESTADO_VENTA_DESCRIPCION_PENDIENTE;
                    break;
            }

            this.cboEstadoFactura.Enabled = false;
            this.cboEstadoVenta.Enabled = false;

            this.txtSerie.Enabled = true;
            this.txtNumero.Enabled = true;
            // Estableciendo focus al boton buscar cliente
            //this.btnBuscarCliente.Focus();
        }
        private void pintarGrillaDetalle(DataGridView grilla)
        {
            ListPersonalizada<LineaVenta> listaLineaVenta = null;
            listaLineaVenta = (ListPersonalizada<LineaVenta>)grilla.DataSource;

            if (listaLineaVenta != null)
            {
                for (int i = 0; i < listaLineaVenta.Count; i++)
                {
                    LineaVenta lineaVenta = listaLineaVenta[i];
                    grilla.Rows[i].Cells[1].Value = lineaVenta.producto.codigo;
                    grilla.Rows[i].Cells[2].Value = lineaVenta.producto.codProductoProveedor;
                    grilla.Rows[i].Cells[4].Value = lineaVenta.producto.nivelProducto.descripcion + " " +
                        lineaVenta.producto.nivelTipo.descripcion + " " +
                        lineaVenta.producto.nivelMaterial.descripcion + " " +
                        lineaVenta.producto.nivelColor.descripcion;
                }
            }
        }

        private void pintarGrillaDetalleFactura(DataGridView grilla)
        {
            ListPersonalizada<LineaFacturacion> listaLineaFactura = null;
            listaLineaFactura = (ListPersonalizada<LineaFacturacion>)grilla.DataSource;

            if (listaLineaFactura != null)
            {
                for (int i = 0; i < listaLineaFactura.Count; i++)
                {
                    LineaFacturacion lineaFactura = listaLineaFactura[i];
                    grilla.Rows[i].Cells[1].Value = Constantes.VALOR_CERO;//lineaVenta.producto.codigo;
                    grilla.Rows[i].Cells[2].Value = Constantes.VALOR_CERO;//lineaVenta.producto.codProductoProveedor;
                    grilla.Rows[i].Cells[4].Value = lineaFactura.descripcion;
                }
            }
        }

        private void imprimirFactura()
        {
            if (this.clienteActual == null)
            {
                Libreria.ShowMessageboxInfo("Debe buscar un cliente ", TITULO);
                return;
            }
            if (this.tabControl.Enabled == false)
            {
                Libreria.ShowMessageboxInfo("Debe abrir un documento", TITULO);
                return;
            }
        
            //Luego imprime la facturación según sea el tipo de documento
            ImprimirDocumentoVenta imprimirDocumento = null;
            //Se envia la cabecera de la venta, pero la fecha y el detalle de la facturación para imprimir
            imprimirDocumento = new ImprimirDocumentoVenta(this.ventaActual, this.facturaActual);
            //Se envia los datos de la impresora
            imprimirDocumento.establecerImpresora(ConfigurationManager.AppSettings[LLAVE_DIRECCIONIMPRESORA]);
            //Se selecciona el tipo de documento a imprimir

            //Para facturas
            if (this.cboTipoDocVenta.SelectedValue.ToString().Equals(Constantes.CODIGO_TIPO_VENTA_FACTURA))
            {
                switch (this.txtSerie.Text)
                {
                        //Para facturas en Chacarilla con el formato en cuadernillo
                    case Constantes.SERIE_CHACARILLA:
                        imprimirDocumento.ejecutarFactura004();
                        break;
                        //Para facturas en San Isidro en el formato en cuadernillo
                    case Constantes.SERIE_SANISIDRO:
                        imprimirDocumento.ejecutarFactura0001();
                        break;
                        //En el caso que el número de serie no coincida
                    default:
                        break;
                }
            }
                //Para Boletas
            else if (this.cboTipoDocVenta.SelectedValue.ToString().Equals(Constantes.CODIGO_TIPO_VENTA_BOLETA))
            {
                switch (this.txtSerie.Text)
                {
                        //En el caso que tenga la serie del cuadernillo de Chacarilla
                    case Constantes.SERIE_CHACARILLA:
                        imprimirDocumento.ejecutarBoleta004();
                        break;
                        //En el caso que tenga la serie de cuadernillo de San Isidro
                    case Constantes.SERIE_SANISIDRO:
                        imprimirDocumento.ejecutarBoleta0001();
                        break;
                        //En el caso que el número de serie no coincida
                    default:
                        break;
                }
            }

            Libreria.ShowMessageboxInfo("Finalizó proceso de impresión", TITULO);
   
        }

        private void creaGuiaElectronica()
        {
            //Crea Guia Electronica Nueva
            Guia guiaElectronica = new Guia();

            //Temporalmente le asigna un código 0 que en Java se actualiza
            guiaElectronica.codGuia = Constantes.VALOR_CERO;
            //Se considera que el bien vendido ha sido DESPACHADO
            guiaElectronica.estado = Constantes.ESTADO_DOCUMENTO_DESPACHADO;
            //Se toma la fecha y hora de manera temporal como fecha de emisión
            guiaElectronica.fechaEmision = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);
            //Se toma la fecha y hora de manera temporal como fecha de registro
            guiaElectronica.fechaRegistro = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);
            //Se indica el tipo de guia
            guiaElectronica.tipoGuia = new TipoGuia();
            guiaElectronica.tipoGuia.codigo = Constantes.CODIGO_TIPO_GUIA_ELECTRONICA;
            guiaElectronica.tipoGuia.descripcion = Constantes.DESCRIPCION_TIPO_GUIA_ELECTRONICA;
            //Se cambia el estado de la venta
            this.ventaActual.estado = Constantes.ESTADO_VENTA_DESPACHADO;
            //Se le asigna la venta actual
            guiaElectronica.venta = this.ventaActual;
            //Se crean las lineas de la guia
            guiaElectronica.listaLineaGuia = new ListaLineaGuia();
            //la variable iNumeroLinea es una numeración de linea temporal
            int iNumeroLinea = 1;

            //se abre el contenido de la Venta, por que se cargaran todas las lineas en la guia
            foreach (LineaVenta lineaVenta in this.ventaActual.listaLineaVenta.lista)
            {
                //Se crea la linea de Guia
                LineaGuia lineaGuiaNueva = new LineaGuia();
                //Se asigna un codigo en Valor 0 para faciltar la identifiación de la guia
                lineaGuiaNueva.codGuia = Constantes.VALOR_CERO;
                //Se coloca la cantidad que se grabó en la venta
                lineaGuiaNueva.cantidad = lineaVenta.cantidad;
                //Se asigna el producto que esta en la venta
                lineaGuiaNueva.producto = lineaVenta.producto;
                //Se coloca el valor de la linea de la guia
                lineaGuiaNueva.numeroLinea = iNumeroLinea.ToString();
                //Se crea la lista para incluir los items que se van a trasladar
                lineaGuiaNueva.listaLineaGuiaItem = new ListaLineaGuiaItem();

                foreach (LineaVentaItem lineaVentaItem in lineaVenta.listaLineaVentaItem.lista)
                {
                    //Se crea la linea de Item
                    LineaGuiaItem lineaGuiaItem = new LineaGuiaItem();
                    //Se asigna el Item
                    lineaGuiaItem.item = lineaVentaItem.item;
                    //Se coloca el numero de la linea
                    lineaGuiaItem.nroLinea = lineaGuiaNueva.numeroLinea;
                    //Se adopta el número temporal de la guia
                    lineaGuiaItem.codGuia = Constantes.VALOR_CERO;
                    //Se carga el item en la linea de la guia Item
                    lineaGuiaNueva.listaLineaGuiaItem.add(lineaGuiaItem);
                }
                //Se carga la lineaGuia en el sistema
                guiaElectronica.listaLineaGuia.add(lineaGuiaNueva);
                //Se suma una linea nueva
                iNumeroLinea++;
            }

            //La guia esta llena

            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_REGISTRAR_GUIA_DOCUMENTO;

                operacion.guia = guiaElectronica;
                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                {
                    contenidoXML = conexionREST.ejecutarOperacion(operacion);
                }

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxInfo(operacionError.descripcion, TITULO);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    Libreria.ShowMessageboxInfo("Se generó el registro de la salida correctamente", TITULO);
                    this.grpDatos.Enabled = false;

                    // Estableciendo los estados de los botones
                    cambiarEstadoBotones(Opcion.Grabar);
                }
                else
                {
                    Libreria.ShowMessageboxError("No se creo el registro de la salida", TITULO);
                    return;
                }


            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, this.Text);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private Boolean grabar()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            if (this.tipoOperacion.Equals(OperacionMantenimiento.Nuevo))
            {
                #region Nuevo

               if (this.ventaActual.listaFacturacion.lista.Count == 0)
                {
                    calcularSaldo();
                }

               //if (this.ventaActual.listaFacturacion.lista.Count > 0)
             //  {
              //  calcularSaldoMas();
              // }

              try
                {
                    if (this.ventaActual.listaFacturacion.lista.Count > 0)
                    {
                        if (this.facturaActual.numero.Equals(this.txtNumero.Text.Trim()))
                        {
                            Libreria.ShowMessageboxInfo("Cambie la serie de la factura y verifique tipo de documento", TITULO);
                            return false;
                        }

                    }

                   /* if (this.facturaActual != null)
                    {
                        if (!this.facturaActual.codFactura.Equals(Constantes.VALOR_CERO)) { return false; }
                    }*/

                    if (validarEntradaBusqueda()) { return false; }


                    this.cboEstadoVenta.SelectedValue = Constantes.ESTADO_VENTA_IMPRESA;

                    this.cboEstadoFactura.SelectedValue = Constantes.ESTADO_VENTA_IMPRESA;

                    // Estableciendo operacion a ser enviada al Servicio REST
                    operacion = new Operacion();
                    operacion.numero = Constantes.OPERACION_REGISTRAR_FACTURA;

                    //----------------------------------------------------------------------
                    // Estableciendo datos de venta que se van a modificar
                    //----------------------------------------------------------------------
                    operacion.venta = this.ventaActual;

                    operacion.venta.estado = this.cboEstadoVenta.SelectedValue.ToString();

                    operacion.venta.diseniador = new Diseniador();
                    operacion.venta.diseniador = this.diseniadorActual;

                    operacion.venta.notaCreditoNumero = this.txtNotaCreditoNumero.Text;
                    operacion.venta.notaCreditoSerie = this.txtNotaCreditoSerie.Text;


                    operacion.venta.cliente = this.clienteActual;


                    operacion.venta.serie = this.ventaActual.serie;  //this.txtSerie.Text;
                    operacion.venta.numero = this.ventaActual.numero; //.txtNumero.Text;
                    operacion.venta.tipoDocumentoVenta.codigo = this.cboTipoDocVenta.SelectedValue.ToString();
                    operacion.venta.saldo = Math.Round(this.txtSaldo.Text.ToDouble(), 2);
                    //this.txtSaldo.Text = Math.Round(this.txtSaldo.Text.ToDouble() - this.txtTotalConsolidado.Text.ToDouble(), 2).ToString(Constantes.FORMATO_DECIMAL);


                    //----------------------------------------------------------------------
                    // Creando Factura
                    //----------------------------------------------------------------------
                    operacion.factura = new Facturacion();
                    operacion.factura.codFactura = Constantes.VALOR_CERO;
                    operacion.factura.estado = this.cboEstadoFactura.SelectedValue.ToString();
                    operacion.factura.formaVenta = this.ventaActual.formaVenta;
                    operacion.factura.moneda = this.ventaActual.moneda;

                    operacion.factura.igvFacturacion = Math.Round(this.txtIGV.Text.ToDouble(), 2);
                    operacion.factura.totalFacturacion = Math.Round(this.txtTotalConsolidado.Text.ToDouble(), 2);
                    operacion.factura.subTotalFacturacion = Math.Round(this.txtSubtotal.Text.ToDouble(), 2);

                    operacion.factura.numero = this.txtNumero.Text;
                    operacion.factura.serie = this.txtSerie.Text;


                    operacion.factura.tiendaFacturacion = new Tienda();
                    operacion.factura.tiendaFacturacion = ParametrosAplicacion.TIENDA_ACTUAL;

                    operacion.factura.tipoDocumentoVenta = new TipoDocumentoVenta();
                    operacion.factura.tipoDocumentoVenta.codigo = this.cboTipoDocVenta.SelectedValue.ToString();

                    operacion.factura.usuario = new Usuario();
                    operacion.factura.usuario = ParametrosAplicacion.USUARIO_ACTUAL;

                    operacion.factura.listaLineaFacturacion = new ListaLineaFacturacion();
                    if (this.chkConsolidado.Checked)
                    {
                        //carga en la lista solo una linea
                        LineaFacturacion lineaFactura = new LineaFacturacion();
                        lineaFactura.cantidad = Constantes.VALOR_UNO;
                        lineaFactura.codFactura = Constantes.VALOR_CERO;
                        lineaFactura.descripcion = this.txtDetalleDescripcion.Text;
                        lineaFactura.numeroLinea = Constantes.VALOR_UNO;
                        lineaFactura.precio = Math.Round(this.txtTotalConsolidado.Text.ToDouble(), 2);

                        operacion.factura.listaLineaFacturacion.add(lineaFactura);
                    }
                    else
                    {
                        //Carga toda la lista que está en el dgvListadoItemsSeleccionados
                        ListPersonalizada<LineaVenta> listaLineaVenta = (ListPersonalizada<LineaVenta>)this.dgvListadoItemsSeleccionados.DataSource;

                        foreach (LineaVenta lineaVenta in listaLineaVenta)
                        {
                            LineaFacturacion lineaFactura = new LineaFacturacion();
                            lineaFactura.codFactura = Constantes.VALOR_CERO;
                            lineaFactura.cantidad = lineaVenta.cantidad;
                            lineaFactura.descripcion = lineaVenta.producto.codProductoProveedor + " - " +
                                                       lineaVenta.producto.nivelProducto.descripcion + " - " +
                                                       lineaVenta.producto.nivelTipo.descripcion + " - " +
                                                       lineaVenta.producto.nivelMaterial.descripcion + " - " +
                                                       lineaVenta.producto.nivelColor.descripcion;
                            lineaFactura.numeroLinea = lineaVenta.numeroLinea;
                            lineaFactura.precio = lineaVenta.precio;

                            operacion.factura.listaLineaFacturacion.add(lineaFactura);
                        }
                    }

                    // Instanciando y ejecutando llamada al ServicioREST
                    ConexionREST conexionREST = new ConexionREST();
                    contenidoXML = conexionREST.ejecutarOperacion(operacion);

                    // Obteniendo Objeto de Error
                    OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                    // Validar si hay error
                    if (operacionError != null)
                    {
                        Libreria.ShowMessageboxError(operacionError.descripcion);
                        return false;
                    }

                    OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                    if ((operacionResultado != null) &&
                        (operacionResultado.esOK.Equals(Constantes.SI)))
                    {
                        this.ventaActual = operacion.venta;
                        if (this.ventaActual.listaFacturacion != null)
                        {
                            this.ventaActual.listaFacturacion = new ListaFacturacion();
                        }
                        this.facturaActual = operacion.factura;
                        this.facturaActual.codFactura = operacionResultado.codigoGenerado;

                        this.ventaActual.listaFacturacion.add(this.facturaActual);

                        return true;
                    }
                    else
                    {
                        return false;
                    }

                }
                catch (Exception ex)
                {
                    log.Error(ex.Message, ex);
                    Libreria.MensajeError(ex, TITULO);
                    return false;
                }
                #endregion
            }
            else
            {
                
                #region Editar
               
                try
                {
                   if (validarEntradaBusqueda()) { return false; }

                    // Estableciendo operacion a ser enviada al Servicio REST
                    operacion = new Operacion();
                    operacion.numero = Constantes.OPERACION_MODIFICAR_FACTURA;

                    //----------------------------------------------------------------------
                    // Estableciendo datos de venta que se van a modificar
                    //----------------------------------------------------------------------
                    operacion.venta = this.ventaActual;

                    operacion.venta.diseniador = new Diseniador();
                    operacion.venta.diseniador = this.diseniadorActual;

                    operacion.venta.notaCreditoNumero = this.txtNotaCreditoNumero.Text;
                    operacion.venta.notaCreditoSerie = this.txtNotaCreditoSerie.Text;

                    operacion.venta.cliente = this.clienteActual;

                    operacion.venta.saldo = Math.Round(this.txtSaldo.Text.ToDouble(), 2);
                    if (this.cboEstadoFactura.SelectedValue.ToString().Equals(Constantes.ESTADO_VENTA_DEVUELTO))
                    {
                        operacion.venta.saldo = this.ventaActual.saldo + this.facturaActual.totalFacturacion;
                    }
                    if (this.cboEstadoFactura.SelectedValue.ToString().Equals(Constantes.ESTADO_VENTA_ANULADO))
                    {
                        operacion.venta.saldo = this.ventaActual.saldo + this.facturaActual.totalFacturacion;
                    }


                    //----------------------------------------------------------------------
                    // recuperando Factura
                    //----------------------------------------------------------------------
                    operacion.factura = this.facturaActual;

                    operacion.factura.estado = this.cboEstadoFactura.SelectedValue.ToString();

                    // Instanciando y ejecutando llamada al ServicioREST
                    ConexionREST conexionREST = new ConexionREST();
                    contenidoXML = conexionREST.ejecutarOperacion(operacion);

                    // Obteniendo Objeto de Error
                    OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                    // Validar si hay error
                    if (operacionError != null)
                    {
                        Libreria.ShowMessageboxError(operacionError.descripcion);
                        return false;
                    }

                    OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                    if ((operacionResultado != null) &&
                        (operacionResultado.esOK.Equals(Constantes.SI)))
                    {
                        Libreria.ShowMessageboxInfo("Dato modificado correctamente", TITULO);
                        this.grpDatos.Enabled = false;

                        // Estableciendo los estados de los botones
                        cambiarEstadoBotones(Opcion.Grabar);

                        return true;
                    }
                    else
                    {
                        return false;
                    }

                }
                catch (Exception ex)
                {
                    log.Error(ex.Message, ex);
                    Libreria.MensajeError(ex, TITULO);
                    return false;
                }
                #endregion
            }

        }

        private bool validarEntradaBusqueda()
        {
            this.txtSerie.Text = this.txtSerie.Text.Trim();
            this.txtNumero.Text = this.txtNumero.Text.Trim();

            if (this.txtNumero.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtNumero, "Debes ingresa el número de documento");
                return true;
            }

            if (this.txtSerie.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtSerie, "Debes ingresar la serie del documento");
                return true;
            }
          
            return false;
        }

        private void elegirDecorador()
        {
            using (frmMantDecorador frmMantDecorador = new frmMantDecorador())
            {
                frmMantDecorador.formularioBusqueda = true;
                if (frmMantDecorador.ShowDialog() == DialogResult.Cancel) { return; }

                this.diseniadorActual = frmMantDecorador.diseniadorActual;
                this.txtDecoradorCodigo.Text = this.diseniadorActual.codDiseniador;
                this.txtDecoradorDescripcion.Text = this.diseniadorActual.nombresyApellidos;
            }
        }

        private void elegirCliente()
        {
            using (frmMantCliente frmMantCliente = new frmMantCliente())
            {
                frmMantCliente.formularioBusqueda = true;
                if (frmMantCliente.ShowDialog() == DialogResult.Cancel) { return; }

                this.clienteActual = frmMantCliente.clienteActual;
                this.txtClienteRazonSocial.Text = this.clienteActual.razonSocial;
            }

        }

        private void asignaPreciosOriginal()
        {
            //-----------------------------------------------------------------------
            //El Precio ya incluye el IGV, en el momento que se decida si el cliente quiere factura o boleta se define el calculo.
            //Si el saldo es igual a la venta total, es la primera factura
            //Sino se cargarán los datos de la siguiente factura
            //-----------------------------------------------------------------------
            // Calculando el total a pagar
            this.txtTotalConsolidado.Text = this.ventaActual.saldo.ToString(Constantes.FORMATO_DECIMAL);
            this.txtTotal.Text = this.ventaActual.total.ToString(Constantes.FORMATO_DECIMAL);
            this.txtSaldo.Text = this.ventaActual.saldo.ToString(Constantes.FORMATO_DECIMAL);
            //obteniendo el monto total
            this.txtSubtotal.Text = Math.Round((this.ventaActual.saldo) / (1 + this.igvActual), 2).ToString(Constantes.FORMATO_DECIMAL);

            //calculando el IGV 
            this.txtIGV.Text = Math.Round(this.txtTotalConsolidado.Text.ToDouble() - this.txtSubtotal.Text.ToDouble(), 2).ToString(Constantes.FORMATO_DECIMAL);
            //-----------------------------------------------------------------------

           // calcularSaldo();
        }

        private void elegirFactura()
        {
            // Valida si seleccione algun cliente
            if (this.dgvListadoFactura.CurrentRow != null && this.dgvListadoFactura.CurrentRow.Index > -1)
            {
                ListPersonalizada<Facturacion> listaFactura = (ListPersonalizada<Facturacion>)this.dgvListadoFactura.DataSource;
                this.facturaActual = listaFactura[this.dgvListadoFactura.CurrentRow.Index];

                // habilita para crear nuevas facturas
                this.tbtnAbrir.Enabled = true;
            }
        }
        private void cancelar()
        {
            if ((this.tipoOperacion == OperacionMantenimiento.Editar) ||
                 (!this.grpDatos.Enabled))
            {
                this.txtClienteBusqueda.Text = this.txtClienteRazonSocial.Text;

                // Refrescar grilla
                pintarGrillaVenta(dgvListadoVenta);
            }

            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

            // Mostrar la primera pagina del TabControl
            this.tabControl.SelectedIndex = 0;

            // Deshabilitando el grupoBox de datos
            this.grpDatos.Enabled = false;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Cancelar);

            // Estableciendo focus
            this.btnBuscar.Focus();
        }

        private void editar()
        {
            this.grpDatos.Enabled = true;
            this.cboEstadoFactura.Enabled = true;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Editar);

            this.tipoOperacion = OperacionMantenimiento.Editar;

            // Estableciendo focus control
            this.cboEstadoFactura.Focus();
        }

        #endregion

        private void tabPagDatos_Click(object sender, EventArgs e)
        {

        }

        private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {

        }

  







    }
}
